# 15. 深浅拷贝

# 赋值

变量赋值,实际是将内存地址赋值给变量

对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 所以. lst1的内存指向和lst2是⼀样的. lst1改变了, lst2也发生了改变

就是说变量在赋值给另一个变量( 变量 = 变量)操作,实际是二个变量引用同一个内存地址,在如果,对其中一个变量进行修改,那会实际修改内存中的数据,那二个变量中的数据都会跟着变

列表

so = ["天衣", "紫衫", "龙服", "金装"]
wo = so

print(so)
print(wo)

so.append("白套")
print(so)
print(wo)

执行结果:
['天衣', '紫衫', '龙服', '金装']
['天衣', '紫衫', '龙服', '金装']
['天衣', '紫衫', '龙服', '金装', '白套']
['天衣', '紫衫', '龙服', '金装', '白套']

字典

so = {"金":"天衣", "木":"紫衫", "火":"龙服", "土":"皇装"}
wo = so

print(so)
print(wo)

so["水"] = "白套"
print(so)
print(wo)

执行结果:
{'金': '天衣', '木': '紫衫', '火': '龙服', '土': '皇装'}
{'金': '天衣', '木': '紫衫', '火': '龙服', '土': '皇装'}
{'金': '天衣', '木': '紫衫', '火': '龙服', '土': '皇装', '水': '白套'}
{'金': '天衣', '木': '紫衫', '火': '龙服', '土': '皇装', '水': '白套'}

# 浅拷贝 - copy()

浅拷贝不比赋值,赋值是将内存地址复制,浅拷贝是将内存中的内容拷贝一份另存

浅拷贝,只会拷贝第一层,第二层的内容不会拷贝,所以称为浅拷贝

格式:变量 = 变量.copy()

so = ["天衣", "紫衫", "龙服", "皇装"]
wo = so.copy()
print(so)
print("拷贝后",wo)
wo.append("白套")
print(so)
print("修改后",wo)

执行结果:
['天衣', '紫衫', '龙服', '皇装']
拷贝后 ['天衣', '紫衫', '龙服', '皇装']
['天衣', '紫衫', '龙服', '皇装']
修改后 ['天衣', '紫衫', '龙服', '皇装', '白套']

​ 以上实例,拷贝后,每个变量都是独立的内容

so = ["天衣", "紫衫", "龙服", "皇装",["金","火",["土","木"]]]
wo = so.copy()
print(so)
print("拷贝后",wo)
wo[4].append("白套")
print(so)
print("增加后",wo)

执行结果:
['天衣', '紫衫', '龙服', '皇装', ['金', '火', ['土', '木']]]
拷贝后 ['天衣', '紫衫', '龙服', '皇装', ['金', '火', ['土', '木']]]
['天衣', '紫衫', '龙服', '皇装', ['金', '火', ['土', '木'], '白套']]
增加后 ['天衣', '紫衫', '龙服', '皇装', ['金', '火', ['土', '木'], '白套']]

​ 以上实例,增加了后,为什么在so变量有

​ 因为,浅拷贝只拷贝一层,如果在列表中,在套进一个列表,那在原始列表只保存小列表的内存地址,而不是实际的内存数据,而浅拷贝只能拷贝一层,所以没有把小列表拷贝复制生成全新的内容数据出,只是拷贝了小列表的内存地址,所以修改小列表中的数据,二个变量都是相同的,因为二个变量存放小列表的内存地址一致

# 深拷贝 - copy.deepcopy()

深拷贝,会把内存内部的所有元素完全进行拷贝复制,不会产生一个中一个改变,另一个跟着改变的问题

格式:变量 = copy.deepcopy(变量)

import copy
so = ["天衣", "紫衫", "龙服", "皇装",["金","火",["土","木"]]]
wo = copy.deepcopy(so)
print(so)
print("拷贝后",wo)
wo[4].append("白套")
print(so)
print("增加后",wo)

执行结果:
['天衣', '紫衫', '龙服', '皇装', ['金', '火', ['土', '木']]]
拷贝后 ['天衣', '紫衫', '龙服', '皇装', ['金', '火', ['土', '木']]]
['天衣', '紫衫', '龙服', '皇装', ['金', '火', ['土', '木']]]
增加后 ['天衣', '紫衫', '龙服', '皇装', ['金', '火', ['土', '木'], '白套']]

# 为什么要有深浅拷贝

拷贝比创建变量对象都要快,